package array;

/**
 * 给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。
 * 你可以对数组执行以下操作 任意次 ：
 * 选择数组里的 任意 一个元素，并将它的 二进制 表示 翻转 一个数位，翻转数位表示将 0 变成 1 或者将 1 变成 0 。
 * 你的目标是让数组里 所有 元素的按位异或和得到 k ，请你返回达成这一目标的 最少 操作次数。
 * <p>
 * 注意，你也可以将一个数的前导 0 翻转。比方说，数字 (101)2 翻转第四个数位，得到 (1101)2 。
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [2,1,3,4], k = 1
 * 输出：2
 * 解释：我们可以执行以下操作：
 * - 选择下标为 2 的元素，也就是 3 == (011)2 ，我们翻转第一个数位得到 (010)2 == 2 。数组变为 [2,1,2,4] 。
 * - 选择下标为 0 的元素，也就是 2 == (010)2 ，我们翻转第三个数位得到 (110)2 == 6 。数组变为 [6,1,2,4] 。
 * 最终数组的所有元素异或和为 (6 XOR 1 XOR 2 XOR 4) == 1 == k 。
 * 无法用少于 2 次操作得到异或和等于 k 。
 * 示例 2：
 * <p>
 * 输入：nums = [2,0,2,0], k = 0
 * 输出：0
 * 解释：数组所有元素的异或和为 (2 XOR 0 XOR 2 XOR 0) == 0 == k 。所以不需要进行任何操作。
 *
 * @author jishenghuang
 * @version 20250409
 */
public class MinOpsToMakeArrXOrEqToK_2997 {
    public static int minOperations(int[] nums, int k) {
        for (int i : nums) {
            k ^= i;
        }

        return Integer.bitCount(k);
    }

    public static void main(String[] args) {
        int[] arr = {2, 1, 3, 4};
        int k = 1;

        System.out.println(minOperations(arr, k));

        arr = new int[]{2, 0, 2, 0};
        k = 0;

        System.out.println(minOperations(arr, k));
    }
}
